package com.itdct.mto.core.manager;

import com.itdct.mto.core.context.ColumnContext;
import com.itdct.mto.core.manager.base.BaseDataTransferManager;

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;

import java.sql.ResultSet;

import lombok.extern.slf4j.Slf4j;

/**
 * @author Zhouwx
 * @date 2025/7/7 10:05:14
 * @version 1.0
 * @description
 */
@ConditionalOnProperty(name = "mto.database-mode", havingValue = "B")
@Component
@Slf4j
public class BDataTransferManager extends BaseDataTransferManager {

    @Override
    protected void appendInsertLineSql(StringBuilder insertBuilder, ColumnContext columnContext) throws Exception {
        ResultSet rs = columnContext.getRs();
        String columnValue = columnContext.getColumnValue();
        String columnType = columnContext.getColumnType();

        if (rs.wasNull()) {
            // INFO: Zhouwx: 2025/7/2 值为NULL，那就直接写入NULL
            insertBuilder.append("NULL");
        } else {
            if (columnValue.isEmpty()) {
                insertBuilder.append("''");
            } else {
                if (columnType.contains("BIT")) {
                    // INFO: Zhouwx: 2025/7/7 bit类型需要单独处理
                    insertBuilder.append("b'").append(columnValue).append("'");
                } else {
                    // INFO: Zhouwx: 2025/7/2 字符串类型都需要转义，防止出现SQL报错
                    if (mtoConfig.isMysqlToMysql()) {
                        columnValue = escapeForMySQL(columnValue);
                    } else {
                        columnValue = escapeForOpenGauss(columnValue);
                    }
                    insertBuilder.append("'").append(columnValue).append("'");
                }
            }
        }

    }

    // 核心转义逻辑（MySQL规则）
    protected String escapeForMySQL(String input) {
        if (input == null) return null;
        return input
                .replace("\\", "\\\\")  // 反斜杠优先转义（否则后续转义符会被误处理）
                .replace("'", "\\'")    // 单引号转义（MySQL核心规则）[7,9](@ref)
                .replace("\"", "\\\""); // 双引号转义（非必须但建议）

    }

    protected String escapeForOpenGauss(String input) {
        if (input == null) return null;
        return input
                .replace("'", "''")
                .replace("\\", "\\\\")
                .replace("\"", "\\\"");
    }
}
